/***********************************************************************
 * Module:  DAOClient.java
 * Author:  Simon
 * Purpose: Defines the Class DAOClient
 ***********************************************************************/

package DAO;

import java.sql.Date;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.ArrayList;

import Modele.Client;

/** Data Access Object d'accès clients */
public class DAOClient {
   /** Renvoie la liste de tous les clients actifs
    * 
    * @return La liste de clients */
   public static ArrayList<Client> getAllClient() {
		Statement stat;
		ArrayList<Client> clients = new ArrayList<Client>();
		try {

			stat = DAO.getConnection().createStatement();
			stat.executeUpdate("use nemovelo");
			ResultSet res = stat.executeQuery("select * from Client where estActif=1");

			Client client;
			int idClient;
			String nom, prenom, lieuDeNaissance;
			boolean estActif;
			Date dateDeNaissance;
			
			while (res.next()) {

				idClient = res.getInt("idClient");
				nom = res.getString("nom");
				prenom = res.getString("prenom");
				dateDeNaissance = res.getDate("dateDeNaissance");
				lieuDeNaissance = res.getString("lieuDeNaissance");
				estActif = res.getBoolean("estActif");

				client = new Client(idClient, nom, prenom,
						dateDeNaissance, lieuDeNaissance, estActif);

				clients.add(client);
			}

		} catch (SQLException e) {
			System.out.println("sql exception");
			while (e != null) {
				System.out.println(e.getErrorCode());
				System.out.println(e.getMessage());
				System.out.println(e.getSQLState());
				e.printStackTrace();
				e = e.getNextException();
			}
		}

		return clients;
   }
   
   /** Renvoie un client en fonction de son identifiant
    * 
    * @param idClient Identifiant du client demandé
    * @return Le client demandé */
   public static Client getClientById(int idClient) {
		Client client = null;
		Statement stat;

		try {

			stat = DAO.getConnection().createStatement();
			stat.executeUpdate("use nemovelo");
			ResultSet res = stat
					.executeQuery("select * from Client where idClient="
							+ idClient);

			String nom, prenom, lieuDeNaissance;
			boolean estActif;
			Date dateDeNaissance;

			if (res.next()) {
				idClient = res.getInt("idClient");
				nom = res.getString("nom");
				prenom = res.getString("prenom");
				dateDeNaissance = res.getDate("dateDeNaissance");
				lieuDeNaissance = res.getString("lieuDeNaissance");
				estActif = res.getBoolean("estActif");

				client = new Client(idClient, nom, prenom,
						dateDeNaissance, lieuDeNaissance, estActif);
			}
		} catch (SQLException e) {
			System.out.println("sql exception");
			while (e != null) {
				System.out.println(e.getErrorCode());
				System.out.println(e.getMessage());
				System.out.println(e.getSQLState());
				e.printStackTrace();
				e = e.getNextException();
			}
		}

		return client;
   }
   
   /** Met à jour un client dans la base
    * 
    * @param client Le client à mettre à jour */
   public static void updateClient(Client client) {
      PreparedStatement stat;
		try {
			stat = DAO.getConnection().prepareStatement(
					"select * from Client where idClient=?",
					ResultSet.TYPE_SCROLL_INSENSITIVE,
					ResultSet.CONCUR_UPDATABLE);

			stat.setInt(1, client.getIdClient());
			ResultSet res = stat.executeQuery();

			if (res.next()) {

				res.updateString("nom", client.getNom());
				res.updateString("prenom", client.getPrenom());
				res.updateDate("dateDeNaissance", new java.sql.Date(client.getDateDeNaissance().getTime()));
				res.updateString("lieuDeNaissance", client.getLieuDeNaissance());
				res.updateBoolean("estActif", client.getEstActif());
				
				res.updateRow();
				
			}

		} catch (SQLException e) {
			System.out.println("sql exception");
			while (e != null) {
				System.out.println(e.getErrorCode());
				System.out.println(e.getMessage());
				System.out.println(e.getSQLState());
				e.printStackTrace();
				e = e.getNextException();
			}
		}
   }
   
   /** Supprime un client de la base
    * 
    * @param client Le client à supprimer */
   public static void deleteClient(Client client) {
      Statement stat;
		try {
			
			stat = DAO.getConnection().createStatement();

			stat.executeUpdate("delete from Client where idClient="
					+ client.getIdClient());

		} catch (SQLException e) {

			System.out.println("sql exception");
			while (e != null) {
				System.out.println(e.getErrorCode());
				System.out.println(e.getMessage());
				System.out.println(e.getSQLState());
				e.printStackTrace();
				e = e.getNextException();
			}
		}
   }
   
   /** Insère un nouveau client dans la base
    * 
    * @param client Le clien à insérer */
   public static void insertClient(Client client) {
      PreparedStatement stat;
		try {
			stat = DAO.getConnection().prepareStatement(
					"insert into Client (nom,prenom,dateDeNaissance,lieuDeNaissance,estActif) values (?,?,?,?,?)");

			
			stat.setString(1, client.getNom());
			stat.setString(2, client.getPrenom());
			stat.setDate(3, new java.sql.Date(client.getDateDeNaissance().getTime()));
			stat.setString(4, client.getLieuDeNaissance());
			stat.setBoolean(5, client.getEstActif());
			
			stat.executeUpdate();


		} catch (SQLException e) {
			System.out.println("sql exception");
			while (e != null) {
				System.out.println(e.getErrorCode());
				System.out.println(e.getMessage());
				System.out.println(e.getSQLState());
				e.printStackTrace();
				e = e.getNextException();
			}
		}
   }

}